package com.walming.generator.support.controller;

import com.walming.generator.common.constant.Constants;
import com.walming.generator.common.core.controller.BaseController;
import com.walming.generator.common.core.domain.AjaxResult;
import com.walming.generator.common.core.page.TableDataInfo;
import com.walming.generator.common.utils.StringUtils;
import com.walming.generator.support.domain.GenTemplate;
import com.walming.generator.support.query.GenTemplateQuery;
import com.walming.generator.support.service.IGenTemplateService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * 模板配置操作处理
 *
 * @author jianxiao
 * @date 2020/12/21 13:35
 */
@Controller
@RequestMapping("/tool/template")
@Api(value = "模板配置操作处理", tags = "模板配置操作处理")
public class TemplateController extends BaseController {

    private static final String PREFIX = "tool/template";

    @Resource
    private IGenTemplateService genTemplateService;

    /**
     * 代码生成模版列表界面
     */
    @GetMapping()
    public String template() {
        return PREFIX + "/template";
    }

    /**
     * 分页条件查询获取模板列表
     *
     * @param tableQuery 查询参数
     * @return 模板列表
     */
    @ResponseBody
    @PostMapping("/list")
    @ApiOperation(value = "分页条件查询获取模板表结构", notes = "分页条件查询获取模板表结构")
    public TableDataInfo<GenTemplate> genList(GenTemplateQuery tableQuery) {
        return toPageResult(genTemplateService.startPage(tableQuery));
    }

    /**
     * 新增模板界面
     */
    @GetMapping("/add/{templateType}")
    public String add(@PathVariable String templateType, ModelMap modelMap) {
        modelMap.put("templateType", templateType);
        return PREFIX + "/add";
    }

    /**
     * 新增保存模板配置
     */
    @ResponseBody
    @PostMapping("/add")
    public AjaxResult<Object> addSave(@Validated GenTemplate template) {
        if (Constants.CONFIG_KEY_NOT_UNIQUE.equals(genTemplateService.checkTemplateUnique(template))) {
            return error(StringUtils.format("新增模板【{}】失败, 模板类型【{}】下【{}】已存在",
                    template.getTemplateName(), template.getTemplateType(), template.getTemplateName()));
        } else {
            return toAjax(genTemplateService.saveTemplate(template));
        }
    }

    /**
     * 修改模版界面
     */
    @GetMapping("/edit/{templateId}")
    public String edit(@PathVariable("templateId") Long templateId, ModelMap modelMap) {
        modelMap.put("template", genTemplateService.getById(templateId));
        return PREFIX + "/edit";
    }

    /**
     * 修改保存模版配置
     */
    @ResponseBody
    @PostMapping("/edit")
    public AjaxResult<Object> editSave(@Validated GenTemplate template) {
        if (Constants.CONFIG_KEY_NOT_UNIQUE.equals(genTemplateService.checkTemplateUnique(template))) {
            return error(StringUtils.format("修改模板【{}】失败, 模板类型【{}】下【{}】已存在",
                    template.getTemplateName(), template.getTemplateType(), template.getTemplateName()));
        } else {
            return toAjax(genTemplateService.updateTemplate(template));
        }
    }

    /**
     * 模版内容编辑界面
     */
    @GetMapping("/editor/{templateId}")
    public String editor(@PathVariable("templateId") Long templateId, ModelMap modelMap) {
        GenTemplate template = genTemplateService.getById(templateId);
        modelMap.put("templateId", template.getTemplateId());
        modelMap.put("templateContent", template.getTemplateContent());
        return PREFIX + "/editor";
    }

    /**
     * 修改保存模版内容
     */
    @ResponseBody
    @PostMapping("/editor")
    public AjaxResult<Object> editorSave(Long templateId, String templateContent) {
        GenTemplate genTemplate = new GenTemplate()
                .setTemplateId(templateId)
                .setTemplateContent(templateContent)
                .setLineNum((long) templateContent.replace("\n", "!@!").split("!@!").length)
                .setByteNum((long) templateContent.getBytes().length);
        return toAjax(genTemplateService.updateTemplate(genTemplate));
    }

    /**
     * 根据模版id删除模版信息
     *
     * @param ids ids（多个用逗号分隔）
     * @return 结果
     */
    @ResponseBody
    @PostMapping("/remove")
    @ApiOperation(value = " 根据模版id删除代码生成模版", notes = "根据模版id删除代码生成模版")
    @ApiImplicitParam(name = "ids", value = "ids（多个用逗号分隔）")
    public AjaxResult<Object> remove(String ids) {
        return toAjax(genTemplateService.deleteTemplateByIds(ids));
    }

    /**
     * 清空缓存
     */
    @ResponseBody
    @GetMapping("/resetCache")
    public AjaxResult<Object> clearCache() {
        genTemplateService.resetCache();
        return success();
    }

    /**
     * 校验模版类型与名称是否唯一
     */
    @ResponseBody
    @PostMapping("/checkTemplateUnique")
    public String checkTemplateUnique(GenTemplate template) {
        return genTemplateService.checkTemplateUnique(template);
    }

}
